{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 双均线策略(Double MA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "import backtrader as bt\n",
    "from backtrader_wrap import single_symbol_spot_backtest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "module 'backtrader.talib' has no attribute 'SMA'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[39mprint\u001b[39m(bt\u001b[39m.\u001b[39mtalib\u001b[39m.\u001b[39mSMA\u001b[39m.\u001b[39m\u001b[39m__doc__\u001b[39m)\n",
      "\u001b[0;31mAttributeError\u001b[0m: module 'backtrader.talib' has no attribute 'SMA'"
     ]
    }
   ],
   "source": [
    "print(bt.talib.SMA.__doc__)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>close_datetime</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datetime</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2021-01-01 00:00:00+00:00</th>\n",
       "      <td>28923.63</td>\n",
       "      <td>29600.00</td>\n",
       "      <td>28624.57</td>\n",
       "      <td>29331.69</td>\n",
       "      <td>1.582527e+09</td>\n",
       "      <td>2021-01-01 23:59:59.999000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-01-02 00:00:00+00:00</th>\n",
       "      <td>29331.70</td>\n",
       "      <td>33300.00</td>\n",
       "      <td>28946.53</td>\n",
       "      <td>32178.33</td>\n",
       "      <td>4.073842e+09</td>\n",
       "      <td>2021-01-02 23:59:59.999000+00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-01-03 00:00:00+00:00</th>\n",
       "      <td>32176.45</td>\n",
       "      <td>34778.11</td>\n",
       "      <td>31962.99</td>\n",
       "      <td>33000.05</td>\n",
       "      <td>4.057598e+09</td>\n",
       "      <td>2021-01-03 23:59:59.999000+00:00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                               open      high       low     close  \\\n",
       "datetime                                                            \n",
       "2021-01-01 00:00:00+00:00  28923.63  29600.00  28624.57  29331.69   \n",
       "2021-01-02 00:00:00+00:00  29331.70  33300.00  28946.53  32178.33   \n",
       "2021-01-03 00:00:00+00:00  32176.45  34778.11  31962.99  33000.05   \n",
       "\n",
       "                                 volume                   close_datetime  \n",
       "datetime                                                                  \n",
       "2021-01-01 00:00:00+00:00  1.582527e+09 2021-01-01 23:59:59.999000+00:00  \n",
       "2021-01-02 00:00:00+00:00  4.073842e+09 2021-01-02 23:59:59.999000+00:00  \n",
       "2021-01-03 00:00:00+00:00  4.057598e+09 2021-01-03 23:59:59.999000+00:00  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "symbol = \"BTCUSDT\"\n",
    "data_folder = \"../binance_klines/1m\"\n",
    "dataframes_1m = pd.read_parquet(\n",
    "    os.path.join(data_folder, f\"{symbol}.parquet\"))[\n",
    "        [\"open\", \"high\", \"low\", \"close\", \"volume\", \"close_datetime\"]]\n",
    "\n",
    "ohlcv_dict = {                                                                                                             \n",
    "    'open': 'first',                                                                                                    \n",
    "    'high': 'max',                                                                                                       \n",
    "    'low': 'min',                                                                                                        \n",
    "    'close': 'last',                                                                                                    \n",
    "    'volume': 'sum',\n",
    "    'close_datetime': 'max',\n",
    "}\n",
    "dataframes_15m = dataframes_1m.resample('15min').agg(ohlcv_dict)\n",
    "dataframes_1h = dataframes_1m.resample('1H').agg(ohlcv_dict)\n",
    "dataframes_4h = dataframes_1m.resample('4H').agg(ohlcv_dict)\n",
    "dataframes_1d = dataframes_1m.resample('1D').agg(ohlcv_dict)\n",
    "dataframes_1M = dataframes_1m.resample('1M').agg(ohlcv_dict)\n",
    "dataframes_1d.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAIZCAYAAABjxW32AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAACH80lEQVR4nO3de1xUdf4/8NdwvyMDyDgEYlwMwrTUVbTSUtHykqubX2MjNcO+q+XXb9pt65vkKpWauattF9dV87Jsl59b2n4RzbRYNIlN1xESUWGQmyJ3lIswvz/8ctbhooDMnDPn83o+HjxyZj5z5n3mxWd6c+ZcNCaTyQQiIiIiIoWyk7sAIiIiIqKbYcNKRERERIrGhpWIiIiIFI0NKxEREREpGhtWIiIiIlI0NqxEREREpGhsWImIiIhI0diwEhEREZGisWElIiIiIkVjw0pEREREisaGlciC8vLyoNFo2v3Y2dnBw8MD4eHhmDVrFvbu3Ss9Z+7cuR0+52Y/Y8eObffahYWFePPNNzFmzBgEBATA2dkZ/v7+GDJkCJ555hns27cP165d6/R18/Ly2i0zJCREejwkJKTd4w0NDVi/fj3uv/9+aLVaODo6wsfHB6GhoRg3bhxeeOEF7N+/v93z2q6Pg4MD3Nzc0K9fPwwbNgzz5s3D3r170dzc3KX391Y/hw4d6nKGREQkPwe5CyASkclkQl1dHXJzc5Gbm4vPPvsMr7/+On73u9/1yrJXr16NN954A42NjWaPlZWVoaysDCdOnMDmzZvx7bffdtjs9kR1dTXGjh2Ln376yez+yspKVFZW4ty5czh48CCMRiMmTJhw02U1Nzfj6tWruHr1KkpKSpCZmYmtW7ciKioKu3btwuDBg3ulZiIisg1sWImsaNiwYfiP//gPmEwm5OXlYfPmzWhoaAAAvPXWW1iyZAlmz56N6Ohos+d98MEHOHfunHR7zZo1Zo8HBQVJ/162bBnWrVsn3bazs8MjjzyCYcOGwcHBAXl5eUhNTUVBQUGvrttbb71l1qxOmTIF9913H+zs7FBQUIDTp0/jhx9+uOVy7rzzTvzmN79BQ0MDjEYjUlJSYDQaAQBZWVkYPXo0Dh8+jKFDh0Kr1bZ7L86ePYsPP/xQuj1hwgTExsaajQkNDb2dVSUiImszEZHFnD9/3gRA+pkzZ47Z488995zZ40eOHOlwOWPGjDEb15mDBw+ajfPz8zNlZGS0G9fc3Gz69NNPTQaDQbpvzpw5Zs89f/58u+f1799ferx///5mj917772drmeriooKU1paWrv7b3zdMWPGmD127do1029/+1uzMeHh4aampqYOX+Pbb781G7t8+fIOxxERke3gPqxEMjCZTMjPz8eRI0fM7tfpdLe13LVr15rd/uCDDzBs2LB24+zs7PD444/j7rvvvq3Xu9GN+5eeO3cOVVVV7cb06dMHo0eP7tZy7e3tsWrVKkyZMkW678yZM9i9e3fPiyUiIpvChpXIirZt2yYddBUSEoLMzEzpsSeeeKLDA5m6qqWlBd9++61028fHBzNmzLidcrvlvvvuk/79/fffIyAgAKNHj8bixYvxySefID8//7aWP3/+fLPbBw4cuK3lERGR7WDDSqQAo0aNMtvvsicuX76Mq1evSrfDw8NhZ2e9Kf7mm2/Cx8dHut3Q0ID09HRs2LABc+bMQUhICB566CEYDIYeLX/gwIFmty9cuHBb9RIRke1gw0pkRcOGDcOaNWuwZs0aLFu2DP369QMApKen4/7778fly5d77bU0Gk2vLasrgoOD8dNPP2HevHnw8PDocMyhQ4fw4IMPorCwsNvLN5lMZretvX5ERCQfNqxEVnT33Xdj2bJlWLZsGdasWYPvv/9earxOnjyJpKSkHi/b19cXLi4u0u2cnBy0tLR0+fmOjo5mt+vr69uNuXELrpOTU7vH+/fvjz//+c8oLy/HkSNH8Pvf/x4zZ86Es7OzNKaiogJbt27tcl2tTp8+bXb7jjvu6PYyiIjINrFhJZJRaGgo/Pz8pNs37oPaXXZ2dnj44Yel2xUVFfjb3/7W5ef7+/ub3T5//rzZ7draWly6dEm63bdv306X5ejoiJEjR2Lx4sX4/PPPcfjwYbPHe7I/66ZNm8xujxs3rtvLICIi28SGlUhG586dQ1lZmXS7qanptpb3wgsvmN3+zW9+g3/+85/txrW0tOCzzz7DqVOnpPtiYmLMxqxbt85si+qqVavMvpYfOXKk2fjXX38de/bsMbt6VisvLy+z276+vl1Ym+uuXbuGV155Bf/7v/8r3RcWFobp06d3eRlERGTbeOEAIis6deqUdOqpixcvYteuXWZN4P33339byx83bhz+67/+C7///e+l1/jFL36BRx99FEOHDoW9vT3y8vKwf/9+GI1Gsy26jzzyCEJDQ3H27FkA14/CDw4ORmRkJC5cuGC2xdXR0RHPPvus2WunpaVh1apV8PX1xYMPPojIyEh4eHiguLgYn376qdnYRx99tNN1KCgowNq1a9HY2Aij0Yi///3vZhc5cHd3R3JycrtdGIiISL3YsBJZ0Y8//ogff/yxw8dCQkLwP//zP7f9Gu+99x78/f3x5ptvoqmpCc3NzdizZw/27Nlz0+c5ODjg888/x6RJk1BaWgrg+qVcv//+e7NxTk5O2LRpE8LDwztczuXLl7F79+5Oz5O6aNEiPPDAA53Wce7cObz44osdPsZLsxIRiYkNK5FMHBwc4O3tjYEDB+LRRx/FokWL0KdPn9terkajwWuvvYY5c+Zg06ZNOHjwIE6fPo3Kykp4eXkhMDAQw4YNw+OPP95ui+6QIUNgMBjwwQcf4O9//zt+/vln1NTUwNXVFf3798fYsWOxaNEiREZGtnvdTz75BN988w2+/fZbGAwGXLx4UdrdISAgAMOGDcO8efPMLgBws3VwdnaGt7c39Ho9oqOj8atf/QqTJ0+Gvb39bb9HRERkWzSmtueKISIiIiJSEB50RURERESKxoaViIiIiBSNDSsRERERKRobViIiIiJSNDasRERERKRobFiJiIiISNHYsBIRERGRorFhJSIiIiJFY8NKRERERIrGhpWIiIiIFI0NKxEREREpGhtWIiIiIlI0NqxEREREpGhsWImIiIhI0diwEhEREZGisWElIiIiIkVjw0pEREREisaGlYiIiIgUjQ0rERERESkaG1YiIiIiUjQ2rERERESkaGxYiYiIiEjR2LASERERkaKxYSUiIiIiRWPDSkRERESKxoaViIiIiBSNDSsRERERKRobViIiIiJSNDasRERERKRobFiJiIiISNHYsBIRERGRorFhJSIiIiJFY8NKRERERIrGhpWIiIiIFI0NKxEREREpGhtWIiIiIlI0NqxEREREpGhsWImIiIhI0diwEhEREZGisWElIiIiIkVjw0pEREREisaGlYiIiIgUjQ0rERERESkaG1YiIiIiUjQ2rERERESkaGxYiYiIiEjR2LASERERkaKxYSUiIiIiRWPDSkRERESKxoaViIiIiBSNDSsRERERKZoqGtbMzEy5SyAZMX9xMXuxMX+xMX+xqKJhtbe3l7sEkhHzFxez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",
      "text/plain": [
       "<Figure size 800x575 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import mplfinance as mpf\n",
    "\n",
    "def plot_klines(df, ):\n",
    "    mpf.plot(\n",
    "        df, type='candle', style='charles', title=symbol,\n",
    "        ylabel='Price', returnfig=True, volume=True,\n",
    "        scale_width_adjustment = dict(volume=0.5, candle=1, lines=0.5),\n",
    "        datetime_format='%y-%m')\n",
    "    \n",
    "plot_klines(dataframes_1M)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 回测"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 编写策略类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DoubleMA(bt.Strategy):\n",
    "    params = (\n",
    "        ('ma_type', None),\n",
    "        ('short_period', None),\n",
    "        ('long_period', None),\n",
    "    )\n",
    "\n",
    "    def __init__(self, ):\n",
    "        self.data_close = self.datas[0].close\n",
    "        if self.params.ma_type == \"sma\":\n",
    "            self.sma_short = bt.indicators.SMA(self.data_close, period=self.params.short_period)\n",
    "            self.sma_long = bt.indicators.SMA(self.data_close, period=self.params.long_period)\n",
    "        elif self.params.ma_type == \"ema\":\n",
    "            self.sma_short = bt.indicators.EMA(self.data_close, period=self.params.short_period)\n",
    "            self.sma_long = bt.indicators.EMA(self.data_close, period=self.params.long_period)\n",
    "        else:\n",
    "            raise ValueError(f\"{self.params.ma_type} must in [sma, ema]\")\n",
    "\n",
    "    def next(self):\n",
    "        position = self.getposition(self.datas[0]).size\n",
    "\n",
    "        # 金叉：短期均线越过长期均线，索引0始终指向当前天\n",
    "        if self.sma_short[0] > self.sma_long[0] and self.sma_short[-1] < self.sma_long[-1]:\n",
    "            # 没有持仓该币种，则半仓市价买入\n",
    "            # 市价单或限价单\n",
    "            if position == 0:\n",
    "                self.amount = self.broker.getcash() / 2.0 / self.data_close[0]\n",
    "                self.order = self.buy(size=self.amount)\n",
    "                \n",
    "        # 死叉：短期均线跌过长期均线，索引-1指向前一天\n",
    "        if self.sma_short[0] < self.sma_long[0] and self.sma_short[-1] > self.sma_long[-1]:\n",
    "            # 持仓了该币种，则全部卖出\n",
    "            if position > 0:\n",
    "                self.sell(size=position)\n",
    "\n",
    "    # 当order状态发生变化时会调用此函数\n",
    "    # def notify_order(self, order): \n",
    "    #     if order.status in [order.Submitted, order.Accepted]: \n",
    "    #         # broker提交/接受了，买/卖订单则什么都不做  \n",
    "    #         return\n",
    "    #     # 检查一个订单是否完成  \n",
    "    #     # 注意: 当资金不足时，broker会拒绝订单  \n",
    "    #     if order.status in [order.Completed]: \n",
    "    #         if order.isbuy(): \n",
    "    #             print('已买入, %.2f' % order.executed.price) \n",
    "    #         elif order.issell(): \n",
    "    #             print('已卖出, %.2f' % order.executed.price)\n",
    "    #     elif order.status in [order.Canceled, order.Margin, order.Rejected]: \n",
    "    #         print(f\"order failed by {order.status}\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 调用回测引擎"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.04268404270979554\n"
     ]
    }
   ],
   "source": [
    "profit, cerebro = single_symbol_spot_backtest(\n",
    "    dataframes_15m[\"2024-1-1\": \"2024-4-1\"],\n",
    "    DoubleMA, {\"ma_type\":\"ema\", \"short_period\": 8, \"long_period\": 20},\n",
    "    plot=True,\n",
    ")\n",
    "print(profit)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "3aba466d98760e10f57c547ae8ef48ed865b6c839ce75ea251de90807d1dd24d"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
